home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / PowerD / Dmod / dmod_Warp3D / examples / w3d_tri_cgx.d < prev    next >
Encoding:
Text File  |  2002-10-28  |  5.5 KB  |  199 lines

  1. // silly example CGFX+W3D
  2.  
  3. MODULE    'intuition/intuition',
  4.             'intuition/screens',
  5.             'utility/tagitem',
  6.             'graphics/modeid',
  7.             'graphics/view'
  8.  
  9. MODULE    'warp3d',
  10.             'warp3d/warp3d'
  11. MODULE    'cybergraphx/cybergraphics',
  12.             'cybergraphics'
  13.  
  14. PROC Go()
  15.     // build all needed vertexes
  16.     DEF    v1:W3D_Vertex
  17.     DEF    v2:W3D_Vertex
  18.     DEF    v3:W3D_Vertex
  19.  
  20.     v1.x:=width/2;        v1.y:=160
  21.     v1.z:=0.0;    v1.w:=0.0;    v1.u:=0.0;    v1.v:=0.0
  22.     v1.tex3d:=0
  23.     v1.color.a:=1.0;    v1.color.r:=1.0;    v1.color.g:=1.0;    v1.color.b:=0.0
  24.     v1.spec.r:=1.0;    v1.spec.g:=1.0;    v1.spec.b:=1.0;    v1.l:=0
  25.  
  26.     v2.x:=3*width/4;    v2.y:=320
  27.     v2.z:=0.0;    v2.w:=0.0;    v2.u:=0.0;    v2.v:=0.0
  28.     v2.tex3d:=0
  29.     v2.color.a:=1.0;    v2.color.r:=1.0;    v2.color.g:=0.0;    v2.color.b:=1.0
  30.     v2.spec.r:=1.0;    v2.spec.g:=1.0;    v2.spec.b:=1.0;    v2.l:=0
  31.  
  32.     v3.x:=width/4;        v3.y:=320
  33.     v3.z:=0.0;    v3.w:=0.0;    v3.u:=0.0;    v3.v:=0.0
  34.     v3.tex3d:=0
  35.     v3.color.a:=1.0;    v3.color.r:=1.0;    v3.color.g:=1.0;    v3.color.b:=1.0
  36.     v3.spec.r:=0.0;    v3.spec.g:=0.0;    v3.spec.b:=0.0;    v3.l:=0
  37.  
  38.     // setup the triangle from the above vertexes
  39.     DEF    triangle:W3D_TriangleV
  40.     triangle.v1:=v1
  41.     triangle.v2:=v2
  42.     triangle.v3:=v3
  43.     triangle.tex:=NIL
  44.     triangle.st_pattern:=NIL
  45.  
  46.     // prepare the double buffer swap stuff
  47.     DEF    msg:PTR TO IntuiMessage,class,next=TRUE
  48.     WHILE next
  49.         IF msg:=GetMsg(window.UserPort)
  50.             SELECT class:=msg.Class
  51.             CASE IDCMP_MOUSEMOVE
  52.                 v1.x:=msg.MouseX
  53.                 v1.y:=IF msg.MouseY>=height THEN height-1 ELSE msg.MouseY    // clip if needed
  54.             DEFAULT
  55.                 next:=FALSE
  56.             ENDSELECT
  57.             ReplyMsg(msg)
  58.         ENDIF
  59.  
  60.         // lock hardware to allow to use it
  61.         IF W3D_SUCCESS=W3D_LockHardware(context)
  62.             W3D_ClearDrawRegion(context,0)
  63.             W3D_DrawTriangleV(context,triangle)
  64.             W3D_UnLockHardware(context)
  65.         ELSE Raise("LHW")
  66.  
  67.         // swap the buffers
  68.         SwitchBuffers()
  69.     ENDWHILE
  70. ENDPROC
  71.  
  72. PROC SwitchBuffers()
  73.     IFN bufnum
  74.         bm:=buf2.BitMap
  75.         W3D_SetDrawRegion(context,bm,0,scissor)
  76.         buf1.DBufInfo.SafeMessage.ReplyPort:=NIL
  77.         WHILEN ChangeScreenBuffer(screen,buf1);    ENDWHILE
  78.         WaitTOF()
  79.         bufnum:=1
  80.     ELSE
  81.         bm:=buf1.BitMap
  82.         W3D_SetDrawRegion(context,bm,0,scissor)
  83.         buf2.DBufInfo.SafeMessage.ReplyPort:=NIL
  84.         WHILEN ChangeScreenBuffer(screen,buf2);    ENDWHILE
  85.         WaitTOF()
  86.         bufnum:=0
  87.     ENDIF
  88. ENDPROC
  89.  
  90. DEF    Warp3DBase,CyberGfxBase
  91.  
  92. DEF    screen:PTR TO Screen,window:PTR TO Window,context:PTR TO W3D_Context,scissor:PTR TO W3D_Scissor,
  93.         width,height,buf1:PTR TO ScreenBuffer,buf2:PTR TO ScreenBuffer,bm:PTR TO BitMap,bufnum
  94.  
  95. PROC main()
  96.     OpenAll()
  97.     Go()
  98. EXCEPTDO
  99.     CloseAll()
  100.     DEF    err,err2=NIL
  101.     SELECT exception
  102.     CASE "CGX";    err:='unable to open cybergraphics.library'
  103.     CASE "W3D";    err:='unable to open warp3d.library'
  104.     CASE "DRV";    err:='unsuitable 3d driver'
  105.     CASE "N15";    err:='15 bit buffer unsupported'
  106.     CASE "MID";    err:='invalid screen mode'
  107.     CASE "SCR";    err:='unable to open screen'
  108.     CASE "SCB";    err:='unable to get screen buffer'
  109.     CASE "CGB";    err:='no cybergraphics bitmap: screen buffer '
  110.         err2:=["0"+exceptioninfo,0]:CHAR
  111.     CASE "WIN";    err:='unable to open window'
  112.     CASE "CTX";    err:='unable to build context: '
  113.         SELECT exceptioninfo
  114.         CASE W3D_ILLEGALINPUT;    err2:='illegal input'
  115.         CASE W3D_NOMEMORY;        err2:='no memory'
  116.         CASE W3D_NODRIVER;        err2:='no driver'
  117.         CASE W3D_UNSUPPORTEDFMT;err2:='unsupported format'
  118.         CASE W3D_ILLEGALBITMAP;    err2:='illegal bitmap'
  119.         ENDSELECT
  120.     CASE "LHW";    err:='can''t lock hardware'
  121.     DEFAULT;        err:='   ';    StrCopy(err,[exception<<8]:L,3)
  122.     ENDSELECT
  123.     IF exception THEN PrintF('\s\s\n',err,err2)
  124. ENDPROC
  125.  
  126. PROC OpenAll()
  127.     IFN CyberGfxBase:=OpenLibrary('cybergraphics.library',0) THEN Raise("CGX")
  128.     IFN Warp3DBase:=OpenLibrary('Warp3D.library',0) THEN Raise("W3D")
  129.  
  130.     DEF    flags=W3D_CheckDriver()
  131.     IFN flags&W3D_DRIVER_3DHW||flags&W3D_DRIVER_CPU THEN Raise("DRV")
  132.  
  133.     DEF    format=W3D_GetDestFmt()
  134.     IFN format&W3D_FMT_R5G5B5 THEN Raise("N15")
  135.  
  136.     DEF    modeid
  137.     IF (modeid:=BestCModeIDTags(
  138.         CYBRBIDTG_Depth,15,
  139.         CYBRBIDTG_NominalWidth,640,
  140.         CYBRBIDTG_NominalHeight,480,
  141.         TAG_END))=INVALID_ID THEN Raise("MID")
  142.  
  143.     IF IsCyberModeID(modeid)
  144.         width:=GetCyberIDAttr(CYBRIDATTR_Width,modeid)
  145.         height:=GetCyberIDAttr(CYBRIDATTR_Height,modeid)
  146.     ELSE Raise("MID")
  147.  
  148.     IFN screen:=OpenScreenTags(NIL,
  149.         SA_Width,width,
  150.         SA_Height,height,
  151.         SA_DisplayID,modeid,
  152.         SA_ShowTitle,FALSE,
  153.         SA_Draggable,FALSE,
  154.         TAG_END) THEN Raise("SCR")
  155.  
  156.     // prepare double buffering
  157.     IFN buf1:=AllocScreenBuffer(screen,NIL,SB_SCREEN_BITMAP) THEN Raise("SCB")
  158.     IFN GetCyberMapAttr(buf1.BitMap,CYBRMATTR_IsCyberGfx) THEN Raise("CGB",1)
  159.     IFN buf2:=AllocScreenBuffer(screen,NIL,0) THEN Raise("SCB")
  160.     IFN GetCyberMapAttr(buf2.BitMap,CYBRMATTR_IsCyberGfx) THEN Raise("CGB",2)
  161.     buf1.DBufInfo.SafeMessage.ReplyPort:=NIL
  162.     WHILEN ChangeScreenBuffer(screen,buf1);    ENDWHILE
  163.     WaitTOF()
  164.     bm:=buf1.BitMap
  165.     bufnum:=0
  166.  
  167.     IFN window:=OpenWindowTags(NIL,
  168.         WA_CustomScreen,screen,
  169.         WA_Width,screen.Width,
  170.         WA_Height,screen.Height,
  171.         WA_Left,0,
  172.         WA_Top,0,
  173.         WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY|IDCMP_MOUSEMOVE,
  174.         WA_Flags,WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_REPORTMOUSE,
  175.         TAG_END) THEN Raise("WIN")
  176.  
  177.     DEF    cerr
  178.     IFN context:=W3D_CreateContextTags(&cerr,
  179.         W3D_CC_MODEID,modeid,
  180.         W3D_CC_DRIVERTYPE,W3D_DRIVER_BEST,
  181.         W3D_CC_BITMAP,bm,
  182.         W3D_CC_YOFFSET,0,
  183.         TAG_END) THEN Raise("CTX",cerr)
  184.     W3D_SetState(context,W3D_GOURAUD,W3D_ENABLE)
  185.  
  186.     scissor:=[0,0,width,height]:W3D_Scissor
  187.     SwitchBuffers()
  188. ENDPROC
  189.  
  190. PROC CloseAll()
  191.     IF context THEN W3D_DestroyContext(context)
  192.     IF window THEN CloseWindow(window)
  193.     IF buf2 THEN FreeScreenBuffer(screen,buf2)
  194.     IF buf1 THEN FreeScreenBuffer(screen,buf1)
  195.     IF screen THEN CloseScreen(screen)
  196.     IF Warp3DBase THEN CloseLibrary(Warp3DBase)
  197.     IF CyberGfxBase THEN CloseLibrary(CyberGfxBase)
  198. ENDPROC
  199.